﻿namespace AwaitBlocking
{
    internal class Program
    {
        static async Task<string> MyAsyncMethod()
        {
            Console.WriteLine("我的异步方法开始执行");

            // 异步操作，例如网络请求或数据库查询
            string result = await SomeAsyncOperation();

            Console.WriteLine("我的异步方法结束执行");

            return result;
        }

        static async Task<string> SomeAsyncOperation()
        {
            Console.WriteLine("异步操作开始执行");

            // 模拟异步操作

            /* 当遇到 await 时，它会检查 await 右侧的任务状态。如果任务已经完成，那么 await 会立即返回，并且后续的代码会在调用线程上执行。如果任务尚未完成，await 会生成一个状态机，将异步方法的执行上下文保存起来，然后返回到调用线程，使其可以执行其他操作。
             异步方法的执行会在异步操作完成后恢复。await 后面的代码会在异步操作完成时继续执行，但这并不会阻塞当前线程。整个过程是异步的，允许线程在等待异步操作的同时执行其他任务。

            总体而言，await 不会导致线程的阻塞，而是提供了一种非阻塞的等待异步操作完成的方式。这有助于提高程序的性能和响应性。*/
            await Task.Delay(2000);

            Console.WriteLine("异步操作结束执行");

            return "异步执行结果";
        }

        static async Task Main(string[] args)
        {
            Console.WriteLine("主方法开始运行");

            // 调用异步方法，不会阻塞整个应用程序
            Task<string> task = MyAsyncMethod();

            // Main 方法可以在 MyAsyncMethod 执行的同时执行其他操作
            Console.WriteLine("主方法执行其他工作任务。。。");

            // 等待异步方法执行完成
            string result = await task;
            
            Console.WriteLine($"主方法执行完成. 执行结果: {result}");
        }

    }
}